www.gusucode.com > VANET Toolbox- A Vehicular Network Simulator based on DES 程序工具箱matlab源码 > VANET Toolbox- A Vehicular Network Simulator based on DES/VANET_Toolbox/VANET_Toolbox_multiChannel_2018b/phy_ChannelSensing.m

    function out = phy_ChannelSensing( varargin)
    % varargin{1} 
%         0 -- set channel status
%         1 -- get channel status
%         2 -- reset waveformBuff 
%         3 -- set DATA to waveformBuff
%         4 -- set ACK to waveformBuff
%         5 -- get DATA after interference
%         6 -- get ACK after interference

%         varargin{2}:  0 -- channel free 1 -- channel busy
%         varargin{3}: record currently transmitting nodes; Due to the design, a
%         node may send several replicas to several channel. A node cannot
%         interfer itself, interference only came from other nodes in the
%         field. varargin{3} is working with persistent txMap to record if the
%         transmission from specific node already exist. If yes, do not add
%         interference, if no add interference to the 'waveformBuff'
%         variable; 

     persistent status waveformBuff txMap colInd
%      txtEnable=evalin('base','txtEnable');
     
     if isempty(status) || isempty(colInd)
         status=0;         
         colInd=0;
     end
     
     if isempty(waveformBuff)
         waveformBuff=zeros(3935,1);         
     end

     if isempty(txMap)
         txMap=[];
     end
     
%      waveformLength=evalin('base','waveformLength');     
     waveformLength=3935; % temporarily comment evalin to accelerate the simulation efficiency
     switch varargin{1}
         case 0 %0 -- set channel status
             status=varargin{2};
         case 1 %1 -- get channel status
             out=status;
         case 2 %2 -- reset waveformBuff 
             waveformBuff=ones(3935,1);
             txMap=[];
             colInd=0;
         case 3 %3 -- set DATA to waveformBuff     
             % Buff Data  channelSensing(3,waveformPayloadBuffer,entity.data.Address2,obj.getCurrentTime()*1000);
             if ~ismember(varargin{3},txMap)
                 if varargin{nargin}==1
                    disp(['T= ' num2str(varargin{4}) 'ms, <---Channel--->: New Data waveform from node' num2str(varargin{3}) ' received.']);
                 end
                 
                 if ~isempty (txMap)>0 && colInd==0
                     colInd=1;
                 end
                 txMap=[txMap varargin{3}];
                 waveformBuff(1:waveformLength)=waveformBuff(1:waveformLength).*varargin{2};         
             else
                 if varargin{nargin}==1
                    disp(['T= ' num2str(varargin{4}) 'ms, <---Channel--->: Data waveform from node ' num2str(varargin{3})  ' already in channel']);
                 end
             end
% 
         case 4 %4 -- set ACK to waveformBuff  
             % Buff ACK    channelSensing(4,waveformPayloadBuffer,entity.data.Address2,obj.getCurrentTime()*1000);             
             if ~ismember(varargin{3},txMap)
                 if varargin{nargin}==1
                    disp(['T= ' num2str(varargin{4}) 'ms, <---Channel--->: New ACK waveform from node' num2str(varargin{3}) ' received,']);
                 end
                 txMap=[txMap varargin{3}];
                 waveformBuff(1:975)=waveformBuff(1:975).*varargin{2};  
             else 
                 if varargin{nargin}==1
                     disp(['T= ' num2str(varargin{4}) 'ms, <---Channel--->: ACK waveform from node ' num2str(varargin{3})  ' already in channel.']);
                 end
             end
             
         case 5  %5 -- get DATA after interference                               % Get Data             
             out=waveformBuff(1:waveformLength);   
             txMap=txMap(txMap~=varargin{3});
             
             if colInd~=0
                 fcn_carGlobalDB('collision',varargin{4});
                 colInd=0;
             end
         case 6  %6 -- get ACK after interference
             % Get ACK
             out=waveformBuff(1:975);
             txMap=txMap(txMap~=varargin{3});
         case 'clearmem'
             clearvars status waveformBuff txMap colInd;
         otherwise
             disp('Wrong varargin{1}s for phy_ChannelSensing!');             
     end                  
             
end